home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 7 / Gekikoh Dennoh Club Vol. 7 (Japan).7z / Gekikoh Dennoh Club Vol. 7 (Japan) (Track 01).bin / tools / d / jlcd100.lzh / TNB_FSW / CDCLUN60.Lzh / CDCLUN.s < prev    next >
Text File  |  1996-06-12  |  9KB  |  472 lines

  1.     .include    TNB.MAC
  2.     .include    IOCSCALL.MAC
  3.     .include    DOSCALL.MAC
  4.     .include    CDC.MAC
  5.  
  6. HEAD1 = 'CDCL'
  7. HEAD2 = 'N060'
  8.  
  9. StartStatio:*******************常駐部
  10. SS:
  11.     .dc.l    -1
  12.     .dc.w    $8000.w
  13.     .dc.l    STRR
  14.     .dc.l    ETYP
  15. dhead:    .dc.l    HEAD1,HEAD2
  16. STRA5:    .dc.l    $0.l
  17. STRR:    move.l    a5,STRA5
  18.     rts
  19. ETYP:
  20.     movem.l    d0/a5,-(a7)
  21.     movea.l    STRA5(pc),a5
  22.     bsr    ETYPSUB
  23.     move.b    d0,$3(a5)
  24.     lsr.w    #8,d0
  25.     move.b    d0,$4(a5)
  26.     movem.l    (a7)+,d0/a5
  27.     rts
  28. ETYPSUB:
  29.     tst.b    $2(a5)
  30.     beq    ETYP_KEEP
  31.     move.w    #$5003,d0    *err
  32.     rts
  33.  
  34.     *********************************************
  35. head:
  36.     .dc.l    HEAD1
  37.     .dc.l    HEAD2
  38.     .even
  39.  
  40. SCALL:    *=========================================
  41.     *    ($1F5)
  42.     *    SCSI IOCS
  43.     *
  44. SCALL__    = $1F5
  45. SCALL_    = $07D4.w
  46.     tst.l    ID            * ID はセットされている?
  47.     bpl    @f
  48.  
  49.     _CDC_CHK_S
  50.     beq    SCALL_EE        * CDC.xが常駐していない
  51.     CDC    _CDC_VERSION
  52.     cmpi.l    #$109,d0
  53.     bcs    SCALL_EE        * CDC.xのバージョンがふるい
  54.     move.l    d1,-(sp)
  55.     moveq    #-1,d1
  56.     CDC    _CDC_POWER
  57.     move.l    (sp)+,d1
  58.     tst.l    d0
  59.     beq    SCALL_EE        * CDC.xが停止している
  60.     CDC    _CDC_SCSIID
  61.     move.l    d0,ID            * ID にセット
  62.     move.l    #_SCSIDRV,d0
  63.  
  64. @@:
  65.     cmpi.w    #_S_SELECT,d1        * _S_SELECTならd4を記憶
  66.     bne    @f            * _S_CMDOUT用にとっておく
  67.     move.l    d4,IDBUP        *
  68. @@:
  69.     cmpi.w    #_S_SELECTA,d1        * _S_SELECTAならd4を記憶
  70.     bne    @f            * _S_CMDOUT用にとっておく
  71.     move.l    d4,IDBUP        *
  72. @@:
  73.     cmpi.w    #_S_CMDOUT,d1        *
  74.     beq    @f            * _S_CMDOUT以外なら
  75.     cmp.w    ID+2(pc),d4        * d4をチェック
  76.     bne    SCALL_JMP            * 対象ID以外ならオリジナルルーチンへ
  77.     bra    1f            *
  78. @@:
  79.     move.l    IDBUP(pc),d0        * _S_CMDOUTなら _SELECTの時のd4控えと比較
  80.     cmp.w    ID+2(pc),d0        * 対象ID以外ならオリジナルルーチンへ
  81.     bne    SCALL_EE            *
  82. 1:
  83.     movem.l    d4/a1,-(sp)
  84.         **--- LUN確認! ---**
  85.     cmpi.w    #_S_CMDOUT,d1        *
  86.     bne    @f            * _S_CMDOUT以外なら
  87.     move.l    IDBUP(pc),d4        * _S_CMDOUTなら _SELECTの時のd4控えをつかう
  88. @@:
  89.     move.l    d4,d0
  90.     swap    d0
  91.     tst.w    d0
  92.     bne    SCALL_EES            * 既に LUNがある
  93.         **--- CDCチェック! ---**
  94.     _CDC_CHK_S
  95.     beq    SCALL_EES            * CDC.xが常駐していない
  96.     CDC    _CDC_VERSION
  97.     cmpi.l    #$109,d0
  98.     bcs    SCALL_EES            * CDC.xのバージョンがふるい
  99.     move.l    d1,-(sp)
  100.     moveq    #-1,d1
  101.     CDC    _CDC_POWER
  102.     move.l    (sp)+,d1
  103.     tst.l    d0
  104.     beq    SCALL_EES            * CDC.xが停止している
  105.     CDC    _CDC_SCSIID
  106.     cmp.w    d0,d4
  107.     bne    SCALL_EES            * CDC.x管理と今のドライブがちがうID
  108.         **--- CDC の LUN を使う ---**
  109.     move.l    d0,d4            * CDC_SCSIIDの戻り値を使う
  110.         **--- 前回のLUNと比べる ---**
  111.     cmp.l    STCID(pc),d4
  112.     beq    @f
  113.     move.l    d4,STCID
  114.     CDC    _CDC_EJEEMU        * 違うならイジェクトされていたことにする
  115. @@:
  116.         **--- LUN変更 ---**
  117.     cmpi.w    #_S_CMDOUT,d1        * _S_CMDOUT以外ならd4をいじるだけ
  118.     bne    SCALL_L1
  119.         **--- LUN変更 及び [_S_CMDOUT]LUN対応対策 ---**
  120.     move.b    (a1),d0
  121.     andi.b    #$E0,d0            * CMDの長さを調べる!
  122.     bne    @f
  123.     moveq    #6-1,d0            * グループ0 6byte
  124.     bra    1f
  125. @@:    rol.b    #3,d0
  126.     cmpi.b    #3,d0
  127.     bcc    @f
  128.     moveq    #10-1,d0        * グループ1,2 10byte
  129.     bra    1f
  130. @@:    cmpi.b    #5,d0
  131.     bne    @f
  132.     moveq    #12-1,d0        * グループ5 12byte
  133.     bra    1f
  134. @@:                    * グループ(4,5),6,7
  135.     move.l    d3,d0            * これらはd3で決められている
  136.     subq.w    #1,d0
  137. 1:
  138.     move.l    a2,-(sp)
  139.     lea    CMDBUP(pc),a2        *
  140. @@:    move.b    (a1)+,(a2)+        * 命令を書き替えるので一度コピー
  141.     dbra    d0,@b            *
  142.     movea.l    (sp)+,a2
  143.     lea    CMDBUP(pc),a1        * こっちの命令ブロックを渡す
  144.     andi.b    #%0001_1111,1(a1)
  145.     swap    d4
  146.     lsl.w    #5,d4
  147.     or.b    d4,1(a1)        * LUNフィールドにLUNを書き込む
  148.     *bra    SCALL_L1
  149. SCALL_L1:        **--- オリジナル IOCS ROUTINE 同等 ---**
  150.     bsr    SCALL_EE
  151.     movem.l    (sp)+,d4/a1
  152.     rts
  153.  
  154. SCALL_EES::    **--- オリジナル IOCS ROUTINE へ ---**
  155.     movem.l    (sp)+,d4/a1
  156. SCALL_EE::    **--- オリジナル IOCS ROUTINE へ ---**
  157.     move.l    #_SCSIDRV,d0
  158. SCALL_JMP::
  159.     move.l    SCALL_JPT(pc),-(sp)
  160.     rts
  161. SCALL_JPT:
  162.     .dc.l    0
  163.  
  164. CMDBUP:    .ds.b    128
  165. STCID:    .dc.l    -1    *前のLUN,ID
  166. IDBUP:    .dc.l    0    *最後のSELECT時のID
  167.  
  168.     *-------------------------*
  169. __COM__:
  170.  
  171. ID:
  172.     .dc.l    -1    * 対応ID
  173. StaMod:
  174.     .dc.b    0
  175.     .even
  176.  
  177. __COM__S:
  178.  
  179. EndStatio:*******************常駐部
  180.  
  181.  
  182. ETYP_KEEP:*----------------------------------------
  183.         **常駐!
  184.     move.l    #EndStatio,$e(a5)
  185.  
  186.     Print    CRLF(pc)
  187.     Print    LR1(pc)
  188.     bsr    keepdisp
  189.     Print    LR2(pc)
  190.     move.b    #-1,StaMod
  191.     moveq.l    #$00,d0
  192.     rts
  193.  
  194.  
  195. MarkerChk:*----------------------------------------
  196.     *    a0 アドレス
  197.     *
  198.     *[戻り値] bne ちがう
  199.     *      beq あっている
  200.     cmpa.l    #$00F00000,a0
  201.     bcc    @f
  202.     cmp.l    #HEAD1,(a0)
  203.     bne    @f
  204.     cmp.l    #HEAD2,4(a0)
  205.     bne    @f
  206.     cmpa.l    a0,a0        *z=1
  207. @@:
  208.     rts
  209.  
  210.  
  211. InvChk:*----------------------------------------
  212.     *    a0.l==なら非常駐
  213.     *    a0.l!=なら常駐
  214.     movea.l    (a0),a0            *一つ前のポインタ
  215.     cmpa.l    #$00F00000,a0
  216.     bcc    IC1
  217.     cmp.l    #HEAD1,$0100+(head-SS)(a0)
  218.     bne    @f
  219.     cmp.l    #HEAD2,$0104+(head-SS)(a0)
  220.     bne    @f
  221.     adda.l    #$100,a0    **[SS]のポインタ
  222.     rts
  223. @@:                    **違う
  224.     tst.l    (a0)            *一つ前のポインタ
  225.     bne    InvChk            *0でない(上へ)
  226. IC1:    sub.l    a0,a0    *非常駐
  227.     rts
  228. DevChk:*----------------------------------------
  229.     *    a0.l==なら非常駐
  230.     *    a0.l!=なら常駐
  231.     movea.l    #$6800,a0
  232. DC1:    cmp.l    #'NUL ',(a0)
  233.     bne    @f
  234.     cmp.l    #'    ',4(a0)
  235.     bne    @f
  236.     bra    DC4
  237. @@:
  238.     addq.l    #2,a0
  239.     bra    DC1    *絶対あるはず。。
  240. DC4:
  241.     move.l    d0,-(sp)
  242.     suba.l    #(dhead-SS),a0    *リンクポインタ
  243. DC2:    movea.l    (a0),a0
  244.     move.l    a0,d0
  245.     bmi    DC3
  246.     cmp.l    #HEAD1,(dhead-SS)(a0)
  247.     bne    DC2
  248.     cmp.l    #HEAD2,(dhead-SS)+4(a0)
  249.     bne    DC2
  250.     cmp.l    #HEAD1,(head-SS)(a0)
  251.     bne    DC2
  252.     cmp.l    #HEAD2,(head-SS)+4(a0)
  253.     bne    DC2
  254.     *あった
  255.     move.l    (sp)+,d0
  256.     rts
  257. DC3:
  258.     move.l    (sp)+,d0
  259.     sub.l    a0,a0    *非常駐
  260.     rts
  261.  
  262.  
  263. .if 0
  264. AtoI:*----------------------------------------
  265.     *    a2 アドレス
  266.     *[戻り値] d0.l 数字
  267.     moveq    #0,d0
  268.     move.b    (a2),d2
  269.     cmpi.b    #'$',d2
  270.     jbeq    AtoHI
  271. @@:    move.b    (a2)+,d2
  272.     subi.b    #'0',d2
  273.     jbcs    AIr
  274.     cmpi.b    #9,d2
  275.     jbhi    AIr
  276.     andi.l    #$0000FF,d2
  277.     mulu    #10,d0
  278.     add.l    d2,d0
  279.     jbra    @b
  280. AIr:    subq    #1,a2
  281.     rts
  282. AtoHI:
  283.     *(Hex専用)
  284.     move.b    (a2)+,d2    *$ skip
  285. @@:    move.b    (a2)+,d2
  286.     subi.b    #'0',d2
  287.     jbcs    AHIL1
  288.     cmpi.b    #9,d2
  289.     jbhi    AHIL1
  290.     lsl.l    #4,d0
  291.     add.l    d2,d0
  292.     jbra    @b
  293. AHIL1:
  294.     ori.b    #$20,d2
  295.     subi.b    #'a'-'0',d2
  296.     jbcs    AHIL2
  297.     cmpi.b    #5,d2
  298.     jbhi    AHIL2
  299.     lsl.l    #4,d0
  300.     addi.l    #10,d0
  301.     add.l    d2,d0
  302.     jbra    @b
  303. AHIL2:    subq    #1,a2
  304.     rts
  305. .endif
  306.  
  307. init:*------------------------------------------------------------------
  308.     Print    LR1(pc)
  309.  
  310.     ** 常駐チェック **
  311.     suba.l    a1,a1
  312.     SUPER
  313.     movea.l    d0,a1
  314.  
  315.     moveq    #0,d1
  316.     bsr    InvChk
  317.     move.l    a0,d0
  318.     bne    @f
  319.     bsr    DevChk
  320. @@:    movea.l    a0,a3        *常駐先頭アドレス
  321.  
  322.     movea.l    SCALL_,a0
  323.     suba.l    #SCALL-head,a0
  324.     bsr    MarkerChk
  325.     bne    @f
  326.     bset    #0,d1
  327. @@:
  328.                 *d1に常駐状態
  329.     USER
  330.  
  331.     ** 常駐していたらそのデータを引用 **
  332.     move.l    a3,d0
  333.     beq    conl
  334.     suba.l    a1,a1
  335.     SUPER
  336.     movea.l    d0,a1
  337. *     move.w    proc-SS(a3),proc
  338. *     move.l    _SFTK-SS(a3),_SFTK
  339. *     move.b    _TRGK-SS(a3),_TRGK
  340.      move.b    StaMod-SS(a3),StaMod
  341.     USER
  342.  
  343. conl:    ** コマンドラインチェック **
  344.     tst.b    (a2)+        *スキップ
  345. sw:    move.b    (a2)+,d0
  346.     beq    keep
  347.     cmpi.b    #' ',d0
  348.     beq    sw
  349.     cmpi.b    #$09,d0        *tab
  350.     beq    sw
  351.     cmpi.b    #'-',d0
  352.     beq    swc
  353.     cmpi.b    #'/',d0
  354.     beq    swc
  355. swe:    pea    LR6(pc)
  356.     bra    PE    *end
  357. swc:    **スイッチ判断
  358.     move.b    (a2)+,d0
  359.     beq    swe
  360.     cmpi.b    #'?',d0
  361.     beq    help
  362.     ori.b    #$20,d0    *小文字化!
  363.     cmpi.b    #'r',d0
  364.     beq    free
  365.     cmpi.b    #'h',d0
  366.     beq    help
  367.     pea    LR7(pc)
  368.     bra    PE    *end
  369. help:
  370.     pea    LRH(pc)
  371.     bra    PE    *end
  372.  
  373.  
  374. keep:    ************************** 常駐させる
  375.     move.l    a3,d0
  376.     beq    keepL1
  377.         *既に常駐、設定変更
  378. *    suba.l    a1,a1
  379. *    SUPER
  380. *    movea.l    d0,a1
  381. *     move.l    _SFTK(pc),_SFTK-SS(a3)
  382. *     move.b    _TRGK(pc),_TRGK-SS(a3)
  383. *    USER
  384.     move.w    MC(pc),d0
  385.     bne    @f
  386.     pea    LR5(pc)
  387.     bra    PE    *end
  388. @@:    pea    LR5_(pc)
  389.     bra    PE    *end
  390. keepL1:
  391.     **セット
  392.     suba.l    a1,a1
  393.     SUPER
  394.     movea.l    d0,a1
  395.      bsr    keepdisp
  396.     USER
  397.  
  398.     Print    LR2(pc)
  399.     Print    LRKP(pc)
  400.     clr.w    -(sp)
  401.     move.l    #EndStatio-StartStatio,-(sp)
  402.     DOS    _KEEPPR
  403.  
  404. keepdisp:***************
  405.     lea    SCALL_JPT(pc),a0
  406.     move.l    SCALL_,(a0)
  407.     lea    SCALL(pc),a0
  408.     move.l    a0,SCALL_
  409.     rts
  410.  
  411. free:    *****************************常駐解除
  412.     move.l    a3,d0
  413.     bne    @f
  414.     pea    LR8(pc)        **非常駐
  415.     bra    PE    *end
  416. @@:
  417.     tst.b    StaMod
  418.     beq    @f
  419.     pea    LRCN(pc)    **CONFIG常駐
  420.     bra    PE    *end
  421. @@:
  422.     cmpi.w    #$01,d1
  423.     beq    @f
  424.     pea    LR4(pc)        **ベクタが占領
  425.     bra    PE    *end
  426. @@:
  427.     suba.l    a1,a1
  428.     SUPER
  429.     movea.l    d0,a1
  430.  
  431.     move.l    (SCALL_JPT-SS)(a3),SCALL_
  432.  
  433.     USER
  434.  
  435.     sub.l    #$00000F0,a3
  436.     move.l    a3,-(sp)
  437.     DOS    _MFREE
  438.     addq.l    #4,sp
  439.  
  440.     pea    LR3(pc)
  441. PE:    DOS    _PRINT
  442.     addq.l    #4,sp
  443.     DOS    _EXIT
  444.  
  445. MC:    .dc.w    0    *モードをいじった
  446. LR2:    .dc.b    ' CD-ROM の LUN(TRAY) を CDC.x で管理します。',$0d,$0a,0
  447. LRKP:    .dc.b    ' 常駐しました。',$0d,$0a,0
  448. LR3:    .dc.b    ' 常駐解除しました。',$0d,$0a,0
  449. LR4:    .dc.b    ' ベクタが占領されています。',$0d,$0a,0
  450. LR5:    .dc.b    ' 既に常駐しています。',$0d,$0a,0
  451. LR5_:    .dc.b    ' 設定を変更しました。    ',$0d,$0a,0
  452. LR6:    .dc.b    ' コマンドラインが異常です。',$0d,$0a,0
  453. LR7:    .dc.b    ' スイッチが異常です。',$0d,$0a,0
  454. LR8:    .dc.b    ' 常駐していません。',$0d,$0a,0
  455. LRCN:    .dc.b    ' CONFIG.SYSで登録されています。',$0d,$0a
  456.     .dc.b    ' 常駐解除できません。',$0d,$0a,0
  457.     .even
  458. LRH:    .dc.b    $0d,$0a
  459.     .dc.b    '使用法:CDCLUN.x [switch]',$0d,$0a
  460.     .dc.b    '    /R ・・・・・・・・ 常駐解除します。',$0d,$0a
  461.     .dc.b    $0d,$0a
  462.     .dc.b    ' CD-ROM の LUN(TRAY) を CDC.x で管理します。',$0d,$0a,0
  463.     .dc.b    $0d,$0a
  464.     .dc.b    0
  465.     .even
  466. LR1:    .dc.b    'X68k 多連装CD-ROM LUN DRIVER with CDC.x Version 0.60 Copyright 1996 TNB製作所'
  467. CRLF:    .dc.b    $0d,$0a,0
  468.     .even
  469.  
  470.     .end    init
  471.  
  472.